home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 98 / Skunkware 98.iso / osr5 / devtools / dejagnu-971222 / usr / local / share / dejagnu / debugger.exp < prev    next >
Encoding:
Text File  |  1998-03-22  |  5.2 KB  |  245 lines

  1. # Copyright (C) 92, 93, 94, 95, 1996 Free Software Foundation, Inc.
  2.  
  3. # This program is free software; you can redistribute it and/or modify
  4. # it under the terms of the GNU General Public License as published by
  5. # the Free Software Foundation; either version 2 of the License, or
  6. # (at your option) any later version.
  7. # This program is distributed in the hope that it will be useful,
  8. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  10. # GNU General Public License for more details.
  11. # You should have received a copy of the GNU General Public License
  12. # along with this program; if not, write to the Free Software
  13. # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  
  14.  
  15. # Please email any bugs, comments, and/or additions to this file to:
  16. # bug-dejagnu@prep.ai.mit.edu
  17.  
  18. # This file was written by Rob Savoye. (rob@cygnus.com)
  19.  
  20. #
  21. # Dump the values of a shell expression representing variable
  22. # names.
  23. proc dumpvars { args } {
  24.     uplevel 1 [list foreach i [uplevel 1 "info vars $args"] {
  25.     if { [catch "array names $i" names ] } {
  26.         eval "puts \"${i} = \$${i}\""
  27.     } else {
  28.         foreach k $names {
  29.         eval "puts \"$i\($k\) = \$$i\($k\)\""
  30.         }
  31.     }
  32.     }
  33.        ]
  34. }
  35.  
  36. #
  37. # dump the values of a shell expression representing variable
  38. # names.
  39. proc dumplocals { args } {
  40.     uplevel 1 [list foreach i [uplevel 1 "info locals $args"] {
  41.     if { [catch "array names $i" names ] } {
  42.         eval "puts \"${i} = \$${i}\""
  43.     } else {
  44.         foreach k $names {
  45.         eval "puts \"$i\($k\) = \$$i\($k\)\""
  46.         }
  47.     }
  48.     }
  49.        ]
  50. }
  51. #
  52. # Dump the body of procedures specified by a regexp.
  53. #
  54. proc dumprocs { args } {
  55.     foreach i [info procs $args] {
  56.     puts "\nproc $i \{ [info args $i] \} \{ [info body $i]\}"
  57.     }
  58. }
  59.  
  60. #
  61. # Dump all the current watchpoints
  62. #
  63. proc dumpwatch { args } {
  64.     foreach i [uplevel 1 "info vars $args"] {
  65.     set tmp ""
  66.     if { [catch "uplevel 1 array name $i" names] } {
  67.         set tmp [uplevel 1 trace vinfo $i]
  68.         if ![string match "" $tmp] {
  69.         puts "$i $tmp"
  70.         }
  71.     } else {
  72.         foreach k $names {
  73.         set tmp [uplevel 1 trace vinfo [set i]($k)]
  74.         if ![string match "" $tmp] {
  75.             puts "[set i]($k) = $tmp"
  76.         }
  77.         }
  78.     }
  79.     }
  80. }
  81.  
  82. #
  83. # Trap a watchpoint for an array
  84. #
  85. proc watcharray { element type} {
  86.     upvar [set array]($element) avar
  87.     case $type {
  88.     "w" { puts "New value of [set array]($element) is $avar" }
  89.     "r" { puts "[set array]($element) (= $avar) was just read" }
  90.     "u" { puts "[set array]($element) (= $avar) was just unset" }
  91.     }
  92. }
  93.  
  94. proc watchvar { v type } {
  95.     upvar $v var
  96.     case $type {
  97.     "w" { puts "New value of $v is $var" }
  98.     "r" { puts "$v (=$var) was just read" }
  99.     "u" { puts "$v (=$var) was just unset" }
  100.     }
  101. }
  102.  
  103. #
  104. # Watch when a variable is written
  105. #
  106. proc watchunset { arg } {
  107.     if { [catch "uplevel 1 array name $arg" names ] } {
  108.     if ![uplevel 1 info exists $arg] {
  109.         puts stderr "$arg does not exist"
  110.         return
  111.     }
  112.     uplevel 1 trace variable $arg u watchvar
  113.     } else {
  114.     foreach k $names {
  115.         if ![uplevel 1 info exists $arg] {
  116.         puts stderr "$arg does not exist"
  117.         return
  118.         }
  119.         uplevel 1 trace variable [set arg]($k) u watcharray
  120.     }
  121.     }
  122. }
  123.  
  124. #
  125. # Watch when a variable is written
  126. #
  127. proc watchwrite { arg } {
  128.     if { [catch "uplevel 1 array name $arg" names ] } {
  129.     if ![uplevel 1 info exists $arg] {
  130.         puts stderr "$arg does not exist"
  131.         return
  132.     }
  133.     uplevel 1 trace variable $arg w watchvar
  134.     } else {
  135.     foreach k $names {
  136.         if ![uplevel 1 info exists $arg] {
  137.         puts stderr "$arg does not exist"
  138.         return
  139.         }
  140.         uplevel 1 trace variable [set arg]($k) w watcharray
  141.     }
  142.     }
  143. }
  144.  
  145. #
  146. # Watch when a variable is read
  147. #
  148. proc watchread { arg } {
  149.     if { [catch "uplevel 1 array name $arg" names ] } {
  150.     if ![uplevel 1 info exists $arg] {
  151.         puts stderr "$arg does not exist"
  152.         return
  153.     }
  154.     uplevel 1 trace variable $arg r watchvar
  155.     } else {
  156.     foreach k $names {
  157.         if ![uplevel 1 info exists $arg] {
  158.         puts stderr "$arg does not exist"
  159.         return
  160.         }
  161.         uplevel 1 trace variable [set arg]($k) r watcharray
  162.     }
  163.     }
  164. }
  165.  
  166. #
  167. # Delete a watch point
  168. #
  169. proc watchdel { args } {
  170.     foreach i [uplevel 1 "info vars $args"] {
  171.     set tmp ""
  172.     if { [catch "uplevel 1 array name $i" names] } {
  173.         catch "uplevel 1 trace vdelete $i w watchvar"
  174.         catch "uplevel 1 trace vdelete $i r watchvar"
  175.         catch "uplevel 1 trace vdelete $i u watchvar"
  176.     } else {
  177.         foreach k $names {
  178.         catch "uplevel 1 trace vdelete [set i]($k) w watcharray"
  179.         catch "uplevel 1 trace vdelete [set i]($k) r watcharray"
  180.         catch "uplevel 1 trace vdelete [set i]($k) u watcharray"
  181.         }
  182.     }
  183.     }
  184. }
  185.  
  186. #
  187. # This file creates GDB style commands for the Tcl debugger
  188. #
  189. proc print { var } {
  190.     puts "$var"
  191. }
  192.  
  193. proc quit { } {
  194.     log_and_exit;
  195. }
  196.  
  197. proc bt { } {
  198.     puts "[w]"
  199. }
  200.  
  201. #
  202. # create some stub procedures since we can't alias the command names
  203. #
  204. proc dp { args } {
  205.   uplevel 1 dumprocs $args
  206. }
  207.  
  208. proc dv { args } {
  209.   uplevel 1 dumpvars $args
  210. }
  211.  
  212. proc dl { args } {
  213.   uplevel 1 dumplocals $args
  214. }
  215.  
  216. proc dw { args } {
  217.     uplevel 1 dumpwatch $args
  218. }
  219.  
  220. proc q { } {
  221.     quit
  222. }
  223.  
  224. proc p { args } {
  225.     uplevel 1 print $args
  226. }
  227.  
  228. proc wu { args } {
  229.     uplevel 1 watchunset $args
  230. }
  231.  
  232. proc ww { args } {
  233.     uplevel 1 watchwrite $args
  234. }
  235.  
  236. proc wr { args } {
  237.     uplevel 1 watchread $args
  238. }
  239.  
  240. proc wd { args } {
  241.     uplevel 1 watchdel $args
  242. }
  243.